
local window={}
window.prototype = {x=0,y=0,w=100,h=200}

print(window.w)

--理解 __index 

local mt_index = {}

local obj1 = {}
setmetatable(obj1,{__index=mt_index}) -- __index本身是一个表

print("obj=",obj1.a)

local obj2= {}
setmetatable(obj2,{__index=function (tb,k) -- __index本身是func
    print("obj2 __index tb,k,v=",tb,"k=",k)
    return 20 --返回一个固定值
end}) 

print("obj2=",obj2.a)

--理解 __newindex  当访问table本身和__index元表都没有的字段时 会访问 __newindex

local obj3 = {}
local mt___newindex = {}
setmetatable(obj3,{__newindex=mt___newindex}) --在 __newindex 是一个表
obj3.a = 20 
print("obj3=",obj3.a) --这时候a是nil obj3并没有a值
print("obj3,mt___newindex=",mt___newindex.a) -- 这里是a值是20 通过obj3注入，并且不改变obj3自身


local obj4 = {}
setmetatable(obj4,{__index={b=200},__newindex=function (tb,k,v)
    print("obj4 ___newindex tb,k,v=",tb,k,v) -- 在 __newindex 是一个没有返回值的函数， 当为obj4赋值新字段时执行 并且阻止赋新字段

end})
obj4.a = 10 --尝试添加a字段 
obj4.b = 201 -- 

print("obj4=",obj4.a,"b=",obj4.b) --这里a是nil __newindex阻止了添加新字段


local obj5 = {}
setmetatable(obj5,{__newindex=function (tb,k,v)
    print("obj5 __newindex",tb,k,v)
    rawset(tb,k,v) --设置新值
end})

obj5.a = 200

print("obj5=",obj5.a)

--基于obj5 实现一个只能赋值一次的table (例如配置表的数据 初始化后不能在其他地方修改)
print("----------config---------")

local config = {id=101,name="金币",desc="ddd"}
local mt = {}

mt.__newindex = function( tb,k,v)
    print("config __newindex=",tb,k,v)
    print("key=",k,"不存在,不要修改静态配置")
end

setmetatable(config,mt) 

config.a = 10
config.a = 100
config.a = 201
print("config.a=",config.a)

local extParams = {}
local isLong = extParams and extParams.isLong
print("isLong=",isLong)